package com.ggh.jinjilive;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.alibaba.android.arouter.launcher.ARouter;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ProcessUtils;
import com.faceunity.wrapper.faceunity;
import com.ggh.jinjilive.common.Constants;
import com.ggh.jinjilive.common.MerchantSession;
import com.ggh.jinjilive.dialog.PromptDialog;
import com.ggh.jinjilive.listener.AddOnClickListener;
import com.ggh.jinjilive.pagestatus.EmptyCallback;
import com.ggh.jinjilive.pagestatus.ErrorCallback;
import com.ggh.jinjilive.pagestatus.LoadingCallback;
import com.ggh.jinjilive.remotedata.AppComponent;
import com.ggh.jinjilive.remotedata.DaggerAppComponent;
import com.ggh.jinjilive.remotedata.SpModule;
import com.ggh.jinjilive.remotedata.systemapi.SystemApiServiceModule;
import com.ggh.jinjilive.ui.TotalPageActivity;
import com.ggh.jinjilive.ui.login.LoginActivity;
import com.ggh.jinjilive.utils.ARouterUtils;
import com.ggh.jinjilive.views.faceunity.authpack;
import com.ggh.jinjilive.views.im.helper.ConfigHelper;
import com.ggh.jinjilive.views.im.helper.HelloChatController;
import com.hjq.permissions.XXPermissions;
import com.kingja.loadsir.core.LoadSir;
import com.opensource.svgaplayer.SVGAParser;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMSDKConfig;
import com.tencent.imsdk.v2.V2TIMSDKListener;
import com.tencent.imsdk.v2.V2TIMUserFullInfo;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.tencent.qcloud.tim.uikit.TUIKit;
import com.tencent.qcloud.tim.uikit.base.IMEventListener;
import com.tencent.qcloud.tim.uikit.base.TUIKitListenerManager;
import com.tencent.rtmp.TXLiveBase;
import com.tencent.trtc.TRTCCloudDef;
import com.umeng.analytics.MobclickAgent;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;

import java.util.List;

import xyz.doikki.videoplayer.exo.ExoMediaPlayerFactory;
import xyz.doikki.videoplayer.ijk.IjkPlayerFactory;
import xyz.doikki.videoplayer.player.AndroidMediaPlayerFactory;
import xyz.doikki.videoplayer.player.VideoViewConfig;
import xyz.doikki.videoplayer.player.VideoViewManager;

public class BaseApplication extends Application {

    private static BaseApplication application;

    // 单例模式中获取唯一的MyApplication实例
    public static BaseApplication getInstance() {
        //
        return application;
    }

    private AppComponent appComponent;
    public AppComponent getAppComponent() {
        //
        return appComponent;
    }

    private Context mContext;

    public Context getContext() {
        //
        return mContext;
    }

    public IWXAPI iwxapi;



    @Override
    public void onCreate() {
        super.onCreate();
        //上下文
        application = this;
        //retrofit2框架
        initializeComponent();
        //Bugly
        initBugly();
        //Android平台中对页面、服务提供路由功能的中间件，我的目标是 —— 简单且够用。
        initARouter();
        //友盟
        initUmeng();
        //页面加载
        initLoad();
        //初始化 SDK
        initV2TIM();
        //Application显示Dialog
        initLifecycle();
        //当前项目是否已经适配了分区存储的特性
        XXPermissions();
        //腾讯云直播licence
        TXLiveBase();
        //相芯科技
        initFaceunity();
        //初始化SVG
        initSVG();
        //视频初始化
        initVideoView();
        //初始化微信支付
        initWeChat();
    }

    //retrofit2框架
    private void initializeComponent() {
        appComponent = DaggerAppComponent.builder().systemApiServiceModule(new SystemApiServiceModule(this)).spModule(new SpModule(this)).build();
    }

    /**
     * Bugly
     */
    public void initBugly(){
        if (!MerchantSession.getInstance().getPrivacy()) {
            // 获取当前包名
            String packageName = this.getPackageName();
            // 获取当前进程名
            String processName = ProcessUtils.getCurrentProcessName();
            // 设置是否为上报进程
            CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(this);
            strategy.setUploadProcess(processName == null || processName.equals(packageName));
            // 初始化Bugly
            CrashReport.initCrashReport(getApplicationContext(), Constants.BUGLYAPPID, true);
        }
    }

    // Android平台中对页面、服务提供路由功能的中间件，我的目标是 —— 简单且够用。
    public void initARouter(){
        if (BuildConfig.DEBUG) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(this); // 尽可能早，推荐在Application中初始化
    }

    //友盟
    private void initUmeng() {
        if (!MerchantSession.getInstance().getPrivacy()) {
            //隐私协议
            if (false) {
                UMConfigure.preInit(this, "60bafa2d4d0228352bbcd408", "umeng");
            } else {
                UMConfigure.init(this, "60bafa2d4d0228352bbcd408", "umeng", UMConfigure.DEVICE_TYPE_PHONE, "");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
            }

            MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
            PlatformConfig.setWeixin("wx1131a5b10dcd5a71", "2159dcfef90cc825844c1dec9ceb15a4");
            PlatformConfig.setWXFileProvider("com.blogdove.threepigeonflowwater.fileprovider");
        }
    }

    //页面加载
    public void initLoad() {
        LoadSir.beginBuilder()
                .addCallback(new ErrorCallback())
                .addCallback(new EmptyCallback())
                .addCallback(new LoadingCallback())
                .setDefaultCallback(LoadingCallback.class)
                .commit();
    }

    /**
     * 腾讯云IM
     */
    public void initV2TIM(){
        V2TIMSDKConfig config = new V2TIMSDKConfig();
        config.setLogLevel(V2TIMSDKConfig.V2TIM_LOG_DEBUG);


        /**
         * TUIKit的初始化函数
         *
         * @param context  应用的上下文，一般为对应应用的ApplicationContext
         * @param sdkAppID 您在腾讯云注册应用时分配的sdkAppID
         * @param configs  TUIKit的相关配置项，一般使用默认即可，需特殊配置参考API文档
         */
        TUIKit.init(this,  Constants.SDKAppID, new ConfigHelper().getConfigs());

        TUIKitListenerManager.getInstance().addChatListener(new HelloChatController());
        TUIKitListenerManager.getInstance().addConversationListener(new HelloChatController.HelloConversationController());
        TUIKit.addIMEventListener(new IMEventListener() {
            @Override
            public void onForceOffline() {
                super.onForceOffline();
                //标记登录
                MerchantSession.getInstance().setIsLogin(false);
                //token
                MerchantSession.getInstance().setToken("");
                //当前用户被踢下线，此时可以 UI 提示用户，并再次调用 V2TIMManager 的 login() 函数重新登录。
                PromptDialog promptDialog = new PromptDialog(mContext);
                if(null != promptDialog){
                    promptDialog.show();
                    promptDialog.promptLanguage("你的账号异地登录了");
                    promptDialog.setAddOnClickListener(new AddOnClickListener() {
                        @Override
                        public void onSkipClicked(String sKip) {
                            Intent intent =new Intent(mContext, LoginActivity.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            intent.putExtra("wherever",true);
                            startActivity(intent);//启动Activity
                        }
                    });
                }

            }

            @Override
            public void onUserSigExpired() {
                super.onUserSigExpired();
            }

            @Override
            public void onConnected() {
                super.onConnected();
            }

            @Override
            public void onDisconnected(int code, String desc) {
                super.onDisconnected(code, desc);
            }

            @Override
            public void onWifiNeedAuth(String name) {
                super.onWifiNeedAuth(name);
            }

            @Override
            public void onRefreshConversation(List<V2TIMConversation> conversations) {
                super.onRefreshConversation(conversations);
            }

            @Override
            public void onNewMessage(V2TIMMessage v2TIMMessage) {
                super.onNewMessage(v2TIMMessage);
            }
        });

//        V2TIMManager.getInstance().initSDK(this, Constants.SDKAppID, config, new V2TIMSDKListener() {
//            @Override
//            public void onConnecting() {
//                super.onConnecting();
//                //SDK 正在连接到腾讯云服务器
//            }
//
//            @Override
//            public void onConnectSuccess() {
//                super.onConnectSuccess();
//                //SDK 已经成功连接到腾讯云服务器
//            }
//
//            @Override
//            public void onConnectFailed(int code, String error) {
//                super.onConnectFailed(code, error);
//                //SDK 连接腾讯云服务器失败
//            }
//
//            @Override
//            public void onKickedOffline() {
//                super.onKickedOffline();

//            }
//
//            @Override
//            public void onUserSigExpired() {
//                super.onUserSigExpired();
//                //在线时票据过期：此时您需要生成新的 userSig 并再次调用 V2TIMManager 的 login() 函数重新登录。
//            }
//
//            @Override
//            public void onSelfInfoUpdated(V2TIMUserFullInfo info) {
//                super.onSelfInfoUpdated(info);
//                //登录用户的资料发生了更新
//            }
//        });
    }

    /**
     * 当前项目是否已经适配了分区存储的特性
     */
    public void XXPermissions(){
        // 当前项目是否已经适配了分区存储的特性
        XXPermissions.setScopedStorage(true);
    }

    /**
     * 腾讯云直播licence 设置license 授权
     */
    public void TXLiveBase(){
        //控制台
        TXLiveBase.setConsoleEnabled(true);
        TXLiveBase.setLogLevel(TRTCCloudDef.TRTC_LOG_LEVEL_VERBOSE);
        TXLiveBase.getInstance().setLicence(this, Constants.licenceURL, Constants.licenceKey);
    }

    /**
     * 相芯科技美颜
     */
    public void initFaceunity(){
        int isSetup = faceunity.fuSetup(new byte[0], authpack.A());
    }

    /**
     * 初始化SVG
     */
    public void initSVG(){
        //初始化SVG
        SVGAParser.Companion.shareParser().init(this);
    }

    /**
     * 视频初始化
     */
    public void initVideoView(){
        VideoViewManager.setConfig(VideoViewConfig.newBuilder()
                //调试的时候请打开日志，方便排错
                .setLogEnabled(true)
                //使用使用IjkPlayer解码
                .setPlayerFactory(IjkPlayerFactory.create())
                //使用ExoPlayer解码
                .setPlayerFactory(ExoMediaPlayerFactory.create())
                //使用MediaPlayer解码
                .setPlayerFactory(AndroidMediaPlayerFactory.create())
                .build());
    }

    /**
     * 微信初始化
     */
    public void initWeChat(){
        // 通过WXAPIFactory工厂，获取IWXAPI的实例
        iwxapi = WXAPIFactory.createWXAPI(this, null);
        // 将应用的appId注册到微信
        iwxapi.registerApp(Constants.WX_APP_ID);
    }

    /**
     * 监听前后台状态如此舒服
     */
    private void initLifecycle() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                if (activity.getParent() != null) {//如果这个视图是嵌入的子视图
                    mContext = activity.getParent();
                } else {
                    mContext = activity;
                }
            }

            @Override
            public void onActivityStarted(@NonNull Activity activity) {
                if (activity.getParent() != null) {
                    mContext = activity.getParent();
                } else {
                    mContext = activity;
                }
            }

            @Override
            public void onActivityResumed(@NonNull Activity activity) {
                if (activity.getParent() != null) {
                    mContext = activity.getParent();
                } else {
                    mContext = activity;
                }
            }

            @Override
            public void onActivityPaused(@NonNull Activity activity) {

            }

            @Override
            public void onActivityStopped(@NonNull Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {

            }
        });
    }






}
